home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
c4
/
pro2
/
1n06015a
< prev
next >
Wrap
Text File
|
1990-08-14
|
4KB
|
129 lines
PAGE ,132
; Figure 1
; Install a custom Interrupt 23 (Ctrl-C exception) handler
% .MODEL memodel,lang ;Add model and language support via
;command line macros, e.g.
;MASM /Dmemodel=LARGE /Dlang=C
kbstatseg equ 40h
kbstatofs equ 17h
ctl_on equ 0100b
alt_on equ 1000b
sk_c equ 2eh
EOI equ 20h
PIC equ 20h
kb_inp equ 60h
kb_outp equ 61h
.CODE
_oldvec09 dd ?
_oldvec1b dd ?
public ccrcvd
ccrcvd dw 0
;
; This is our actual ISR
;
myint09:
push ax ;save AX...
pushf ; ...& flags
in al,kb_inp ;get scan code
cmp al,sk_c ;'C'?
jne do_old ;no, forget it
push ax ;yes, save it...
push es ;...& ES reg
mov ax,kbstatseg ;read keyboard status from 40:17
mov es,ax
mov al,es:kbstatofs
test al,ctl_on ;Ctrl pressed?
pop es ;(restore AX, ES)
pop ax
jz do_old ;no, forget it
in al,kb_outp ;yes, toggle keyboard acknowledge line
mov ah,al
or al,80h
out kb_outp,al
xchg al,ah
out kb_outp,al
cli
mov ax,EOI ;send end-of-interrupt code
out PIC,al
mov ax,1
mov CS:ccrcvd,ax
pop ax ;discard original flags...
pop ax ; ...& AX
iret ;all done
do_old:
popf ;restore flags...
pop ax ; ...& AX
jmp dword PTR CS:_oldvec09 ;call our handler
;
; To avoid keyboard confusion, trap Ctrl-Break separately
;
myint1b:
push ax
pushf
mov ax,-1
mov CS:ccrcvd,ax
popf
pop ax
iret
;
; Call this to uninstall our ISR
;
undo09 PROC USES DX DS AX
mov dx, word PTR CS:_oldvec09 ;restore original keyboard vector
mov ds, word PTR CS:_oldvec09+2
mov ax,2509h
int 21h
mov dx, word PTR CS:_oldvec1b ;restore original keyboard vector
mov ds, word PTR CS:_oldvec1b+2
mov ax,251bh
int 21h
ret
undo09 ENDP
;
; Call this to install our ISR
;
ins09 PROC USES AX BX DS ES
mov ax,3509h ;get old keyboard ISR vector...
int 21h
mov word PTR CS:_oldvec09,bx
mov word PTR CS:_oldvec09+2,es ;...and save it
mov ax,351bh ;get old exit vector...
int 21h
mov word PTR CS:_oldvec1b,bx
mov word PTR CS:_oldvec1b+2,es ;...and save it
push cs ;get myint09 segment in DS
pop ds
mov dx, OFFSET myint09 ;install myint09 in int 09h
mov ax,2509h
int 21h
push cs ;get myint1b segment in DS
pop ds
mov dx, OFFSET myint1b ;install myint1b in int 1bh
mov ax,251bh
int 21h
ret
ins09 ENDP
end